/*
 * ficheros.c
 *
 *  Created on: 22/03/2010
 *      Author: teledhil
 */

#include "ficheros.h"
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include "variables.h"
#include "listas.h"

struct file_info * crear_fichero(char *nombre) {

	struct file_info* fichero = malloc(sizeof(*fichero));

	if (sprintf(fichero->nombre, "%s", nombre) < 0) {
		perror("copiando nombre fichero");
		return NULL;
	}

	if ((fichero->fd = creat(fichero->nombre, S_IRWXU | S_IRGRP | S_IROTH)) < 0) {
		perror("creando fichero");
		return NULL;
	}

	//fichero->offset=0;

	return fichero;
}

struct file_info * abrir_fichero(char *nombre) {

	struct file_info* fichero = malloc(sizeof(*fichero));

	if (sprintf(fichero->nombre, "%s", nombre) < 0) {
		perror("copiando nombre fichero");
		return NULL;
	}

	if ((fichero->fd = open(fichero->nombre, O_RDONLY)) < 0) {
		perror("abriendo fichero");
		return NULL;
	}

	//fichero->offset=0;

	return fichero;
}

int escribir_offset_fichero(struct file_info *fichero, long offset,
		char *datos, int longDatos) {

	if (fichero == NULL) {
		perror("fichero no abierto");
		return -1;
	}

	if (lseek(fichero->fd, (off_t) offset, SEEK_SET) != offset) {
		perror("offset");
		return -1;
	}
	write(fichero->fd, datos, longDatos);

	return 0;
}

int escribir_append_fichero(struct file_info *fichero, char *datos,
		int longDatos) {

	if (fichero == NULL) {
		perror("fichero no abierto");
		return -1;
	}

	if (lseek(fichero->fd, 0, SEEK_END) < 0) {
		perror("offset");
		return -1;
	}
	write(fichero->fd, datos, longDatos);

	return 0;
}

int leer_offset_fichero(struct file_info *fichero, long offset, char *datos,
		int longDatos) {

	if (fichero == NULL) {
		perror("fichero no abierto");
		return -1;
	}

	if (lseek(fichero->fd, (off_t) offset, SEEK_SET) != offset) {
		perror("offset");
		return -1;
	}
	read(fichero->fd, datos, longDatos);

	return 0;
}

lista * buscar_ficheros(char *palabras_clave) {

	struct dirent *entrada;
	char *clave;
	lista resultados;

	char *nombre, *temp;

	int encontrado;

	DIR *directorio_busqueda = opendir(sharePath);

	newLista(MENSAJE, &resultados);

	while ((entrada = readdir(directorio_busqueda)) != NULL) {
		//fprintf(stderr,"Encontrado: %s\n",entrada->d_name);
		//Comprueba que sea un fichero y no una carpeta
		if (entrada->d_type == 8) { //8 para ficheros
			encontrado = 1;
			temp = strdup(palabras_clave); //Se copia el string porque strtok
			clave = strtok(temp, " "); // lo corrompe

			//Compara el nombre del fichero con todas las palabras clave
			while (clave != NULL) {
				//fprintf(stderr,"\t\t%s...",clave);
				if (strstr(entrada->d_name, clave) != NULL) {
					//fprintf(stderr," encontrada!");
					//Prepara la siguiente palabra clave a buscar
					clave = strtok(NULL, " ");
					//fprintf(stderr," - Siguiente clave: [%s]\n",clave);
				} else {
					//fprintf(stderr," no encontrada!\n");
					//Este fichero no vale, dejamos de probarlo
					encontrado = 0;
					clave = NULL;
				}
			}
			if (encontrado) {
				//Inserta el fichero en la lista de resultados
				nombre = malloc(strlen(entrada->d_name) * sizeof(char));
				insertLista(&resultados, nombre, NULL);
			}
		}
	}

	return &resultados;
}

int cerrar_fichero(struct file_info *fichero) {

	close(fichero->fd);

	free(fichero->nombre);
	free(fichero);

	return 0;
}
